home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / RDATE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-30  |  3.6 KB  |  169 lines

  1. /* Internet rdate client
  2.  * Author: Brian Teravskis, WD0EFL
  3.  * Date: 03/30/92
  4.  *
  5.  * Based on RFC868 Time Protocol
  6.  *
  7.  * Added local hour offset - Doug Crompton 10/28/92
  8.  * and subcommand menu for possible future commands
  9.  */
  10. #include "global.h"
  11. #ifdef RDATE
  12. #include "commands.h"
  13. #include "mbuf.h"
  14. #include "socket.h"
  15. #include "netuser.h"
  16. #ifndef MSDOS
  17. #ifndef NO_SETTOD
  18. #include <sys/time.h>
  19. #endif
  20. #include "session.h"
  21. #endif
  22.  
  23. #if !defined(_lint)
  24. static char rcsid[] OPTIONAL = "$Id: rdate.c,v 1.18 1997/07/31 00:44:20 root Exp root $";
  25. #endif
  26.  
  27. #ifdef __GNUC__
  28. #define DIFFTIME 2208988800LU
  29. #else
  30. #define DIFFTIME 2208988800
  31. #endif
  32. #define RDATETIMEOUT 30
  33.  
  34. static void rdate_timeout (void *);
  35. static int rdate_offset = 0;
  36.  
  37. static int dordateserver (int argc, char *argv[], void *p);
  38. static int dordateoff (int argc, char *argv[], void *p);
  39.  
  40.  
  41. static struct cmds rdatecmds[] =
  42. {
  43.     { "server",    dordateserver,    512,    2, "rdate server <address>"},
  44.     { "offset",    dordateoff,    0,    0, NULLCHAR},
  45.     { NULLCHAR,    0,        0,    0, NULLCHAR}
  46. };
  47.  
  48.  
  49. int
  50. dordate (argc, argv, p)
  51. int argc;
  52. char *argv[];
  53. void *p;
  54. {
  55.     return subcmd (rdatecmds, argc, argv, p);
  56. }
  57.  
  58.  
  59. static int
  60. dordateserver (argc, argv, p)
  61. int argc OPTIONAL;
  62. char *argv[];
  63. void *p OPTIONAL;
  64. {
  65. struct sockaddr_in sock;
  66. int s, i_state;
  67. struct mbuf *bp;
  68. struct timer *t;
  69. time_t rtime, raw_time, ltime;
  70. #if !defined(MSDOS) && !defined(NO_SETTOD)
  71. struct timeval tv;
  72. #endif
  73.  
  74.     if ((sock.sin_addr.s_addr = resolve (argv[1])) == 0) {
  75.         log (-1, "RDATE:Host %s unknown\n", argv[1]);
  76.         return 1;
  77.     }
  78.     sock.sin_family = AF_INET;
  79.     sock.sin_port = IPPORT_TIME;
  80.  
  81.     /* Open connection to time server */
  82.     if ((s = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
  83.         log (-1, "RDATE:Can't create socket");
  84.         return 1;
  85.     }
  86.     (void) sockmode (s, SOCK_BINARY);
  87.  
  88.     /* Set timeout timer */
  89.     t = (struct timer *) callocw (1, sizeof (struct timer));
  90.  
  91.     t->func = rdate_timeout;
  92.     t->arg = (void *) &s;
  93.     set_timer (t, RDATETIMEOUT * 1000L);
  94.     start_timer (t);
  95.  
  96.     /* Connect to time server */
  97.     if (connect (s, (char *) &sock, sizeof (sock)) == -1) {
  98.         /* Connect failed */
  99.         stop_timer (t);
  100.         free (t);
  101.         log (s, "RDATE: Connect failed");
  102.         (void) shutdown (s, 2);
  103.         close_s (s);
  104.         return 1;
  105.     }
  106.     /* Successful connect, stop timout timer */
  107.     stop_timer (t);
  108.     free (t);
  109.     /* Get time info sent by server */
  110.     if (recv_mbuf (s, &bp, 0, NULLCHAR, (int *) 0) > 0) {
  111.         (void) time (<ime);
  112.         rtime = (time_t) pull32 (&bp);
  113.         /* Convert 1900 start date to 1970 start date */
  114.         rtime -= (time_t) DIFFTIME;
  115.         raw_time = rtime;
  116.         rtime += (rdate_offset * 3600L);
  117.         /* Set the system time */
  118.         i_state = disable ();
  119. #ifndef MSDOS
  120. #ifdef NO_SETTOD
  121.         (void) stime (&rtime);
  122. #else
  123.         tv.tv_sec = rtime;
  124.         tv.tv_usec = 0;
  125.         (void) settimeofday (&tv, NULL);
  126. #endif
  127. #endif
  128.         restore (i_state);
  129.         log (s, "RDATE:Clock set to %s from %s (delta %ld)\n", ctime (&rtime), argv[1], (rtime - ltime));
  130.         tcmdprintf ("\nTime received from %s - %s", argv[1], ctime (&raw_time));
  131.         tcmdprintf ("System time set to %s (delta %ld)\n", ctime (&rtime), (rtime - ltime));
  132.         free_q (&bp);
  133.     }
  134.     close_s (s);
  135.     return 0;
  136. }                /* dordate */
  137.  
  138.  
  139. /*
  140.  * Close socket after timeout on connect
  141.  */
  142. static void
  143. rdate_timeout (arg)
  144. void *arg;
  145. {
  146. int *s;
  147.  
  148.     s = (int *) arg;
  149.     close_s (*s);
  150. }                /* rdate_timeout */
  151.  
  152.  
  153. /* Set time offset */
  154. static int
  155. dordateoff (argc, argv, p)
  156. int argc;
  157. char *argv[];
  158. void *p OPTIONAL;
  159. {
  160.     if (argc < 2) {
  161.         tprintf ("Usage: 'rdate offset <+-hours>' - Current Offset %d Hours\n", rdate_offset);
  162.         return 0;
  163.     }
  164.     rdate_offset = atoi (argv[1]);
  165.     return 0;
  166. }
  167.  
  168. #endif /* RDATE */
  169.